# /data/Work/dev_project/ywadmin/tasks/services.py
from .models import Tasks, TaskDefinition
from django.contrib.auth import get_user_model
import json

"""
# 在 cmdb 模块中
from tasks.services import TaskService

# 创建一个任务
task = TaskService.create_task(
    task_func='cmdb.tasks.sync_devices',
    task_definition_id=1,  # 使用已有的任务定义
    creator_id=request.user.id
)

# 立即执行任务
task_id = TaskService.run_task(task.id)

"""

User = get_user_model()

class TaskService:
    """任务服务类，提供任务相关操作的封装"""
    @staticmethod
    def get_task_definition(task_definition_id):
        if task_definition_id:
            return TaskDefinition.objects.get(id=task_definition_id)
        else:
            return TaskDefinition.objects.all()

    @staticmethod
    def create_task(task_func, task_args=None, task_kwargs=None, task_definition_id=None, 
                   enabled=True, description=None, creator_id=None):
        """
        创建一个新任务
        
        参数:
            task_func: 任务函数名称
            task_args: 任务位置参数 (可选)
            task_kwargs: 任务关键字参数 (可选)
            task_definition_id: 任务定义ID
            enabled: 是否启用
            description: 任务描述
            creator_id: 创建者ID
        
        返回:
            创建的任务实例
        """
        if task_args is None:
            task_args = []
        if task_kwargs is None:
            task_kwargs = {}
            
        # 获取任务定义
        task_definition = TaskDefinition.objects.get(id=task_definition_id)
        
        # 获取创建者
        creator = User.objects.get(id=creator_id)
        
        # 创建任务
        task = Tasks.objects.create(
            task_func=task_func,
            task_args=task_args,
            task_kwargs=task_kwargs,
            task_definition=task_definition,
            enabled=enabled,
            description=description,
            creator=creator,
            updater=creator
        )
        
        return task
    
    @staticmethod
    def update_task(task_id, **kwargs):
        """
        更新任务
        
        参数:
            task_id: 任务ID
            **kwargs: 需要更新的字段
        
        返回:
            更新后的任务实例
        """
        task = Tasks.objects.get(id=task_id)
        
        # 更新字段
        for key, value in kwargs.items():
            if hasattr(task, key):
                setattr(task, key, value)
        
        # 如果有updater_id，设置更新者
        if 'updater_id' in kwargs:
            task.updater = User.objects.get(id=kwargs['updater_id'])
            
        task.save()
        return task
    
    @staticmethod
    def run_task(task_id):
        """
        立即执行任务
        
        参数:
            task_id: 任务ID
        
        返回:
            任务执行ID
        """
        from celery import current_app
        
        task = Tasks.objects.get(id=task_id)
        
        # 解析参数
        args = task.task_args if task.task_args else []
        kwargs = task.task_kwargs if task.task_kwargs else {}
        
        # 发送任务到Celery
        celery_task = current_app.send_task(
            task.task_func,
            args=args,
            kwargs=kwargs
        )
        
        return celery_task.id
    
    @staticmethod
    def enable_task(task_id):
        """启用任务"""
        task = Tasks.objects.get(id=task_id)
        task.enabled = True
        task.save()
        return task
    
    @staticmethod
    def disable_task(task_id):
        """禁用任务"""
        task = Tasks.objects.get(id=task_id)
        task.enabled = False
        task.save()
        return task